import axios from 'axios'
import qs from 'qs'
// import router from '../router'
const service = axios.create({
    baseURL: 'http://localhost:8080',
    timeout: 1000,
});
// 添加请求拦截器
service.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    const accessToken = localStorage.getItem('accessToken');
    if (accessToken) {
        config.headers['Authorization'] = accessToken;
    }
    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});
let isRefreshing = false;

service.interceptors.response.use(
    (response) => {
        return response.data;
    },
    async (error) => {
        if (error.response.status === 401) {
            if (!isRefreshing) {
                isRefreshing = true;

                try {
                    const { data: { accessToken, refreshToken } } = await axios.post('http://localhost:8080/api/refreshToken', null, {
                        headers: {
                            Authorization: localStorage.getItem('refreshToken')
                        }
                    });
                    localStorage.setItem('accessToken', accessToken);
                    localStorage.setItem('refreshToken', refreshToken);
                    console.log("Token refreshed!");
                    // 重新发送原始请求
                    const originalRequest = error.config;
                    originalRequest.headers.Authorization = accessToken; // 更新请求头中的 accessToken
                    return service(originalRequest);
                } catch (err) {
                    console.error("Failed to refresh token:", err);
                    // 清除 Token 相关数据
                    localStorage.removeItem('accessToken');
                    localStorage.removeItem('refreshToken');
                    // 返回一个 rejected 的 Promise
                    return Promise.reject(error);
                } finally {
                    isRefreshing = false;
                }
            } else {
                // 如果正在刷新 token，则等待 token 刷新完成后重新发送请求
                return new Promise((resolve) => {
                    const retryOriginalRequest = () => {
                        resolve(service(error.config));
                    };
                    setTimeout(retryOriginalRequest, 1000); // 延迟 1 秒后重试
                });
            }
        }
        return Promise.reject(error);
    }
);


/*
***url请求路径
***method请求方式
***datas请求参数
***isJson,true||false（控制请求头的content-type）
*/
export function http(url, method, datas = {}, isJson = true) {
    console.log(isJson, 'isJson')
    return new Promise((resolve, reject) => {
        let data = method.toLowerCase() === 'get' ? qs.stringify(datas) : JSON.stringify(datas)
        service({
            url,
            method,
            [method.toLowerCase() === 'get' ? 'params' : 'data']: data,
            headers: {
                "Content-Type": isJson ? "application/json;charset=utf-8" : "application/x-www-form-urlencoded",
            }
        }).then(response => {
            resolve(response);
        }, err => {
            reject(err)
        })
    })
}
// /**
//  * 封装导出列表
//  * @param url
//  * @param data
//  * @returns {Promise}
//  */

// export function exportPost(url, params = {}) {
//     return new Promise((resolve, reject) => {
//         service({
//             url: url,// 请求地址
//             method: 'post',
//             data: params,// 参数
//             responseType: 'blob'// 表明返回服务器返回的数据类型
//         }).then(response => {
//             resolve(response.data);
//         }, err => {
//             reject(err)
//         })
//     })
// }

export default http;